Docker에서의 GitLab

사설...

예전에는 가상환경을 사용하지 않고 GitLab을 서버 OS에 직접 올려서 사용했었다. 처음 GitLab을 설치했던 것은 2013년 이었던것 같다. 지금도 그렇지만 당시 Ubuntu 환경에서 공식적으로 소스 설치하는 방법이 제공됬었고, 비공식적으로 CentOS 6 환경에서 설치하는 방법이 여기저기 돌고 있었다(지금은 Omnipackage 형식으로 쉽게 설치를 할 수도 있다).

비공식 방법을 통해 끙끙거리며 사내 데스크탑급 서버에 설치를 했었다. 이후에 서버를 포맷하고 다시 설치할 일이 있었는데, 엄청난 고생을 했던 기억이 난다..

2013년 당시에는 리눅스에 대한 지식도 많이 부족해서 설치와 테스트에만 3일정도가 소요됐다. 포맷 후에 다시 설치할 때는 만 하루가 꼬박 걸렸었다. 대부분의 시간은 Ruby 버전과 Git 설치, Redis, Nginx, MySQL 설치에서 잡아먹었고, 이후에는 잘 작동되는지 테스트 하는데 시간이 걸렸었다.

여튼... 힘들게 설치하고 잘 운영하고 있던 상황에서 다시 한번 서버를 포맷할 일이 발생했다. 급한데로 GitLab에서 제공하는 백업 방법을 통해 백업을 해두었고, 다시 설치를 하려니 까마득했다. 분명 이 후에도 이런 상황이 또 발생할 것만 같다. 그래서 생각한 것이 Docker에 올려다가 사용하면 엄청 쉬울 것 같아서 알아본 내용을 공유하려고 한다.

설치환경

  • Host OS: CentOS 7.2
  • GitLab version: 7.13.3 docker image
  • DBMS: docker image (MySQL)
  • redis: docker image
  • nginx: docker image

Docker Compose를 통해 정말 빠르게 설치하고 확인할 수 있다. 하지만 난 Docker를 써본적이 없기 때문에 Docker에 익숙해지기 위해서 하나씩 설치하고 올려봤다. Docker compose를 사용해 올리려면 Quick Start 링크를 확인해라.

  1. Docker Compose는 여러 컨테이너를 하나의 클러스터 처럼 구성해서 구동시켜준다. 일일이 컨테이너 생성하고 시작하는건 사실 번거롭긴하다.
  2. 진짜 빨리 설치하고 맛만 보고 싶다면 Quick Start 링크에 나온 것만 읽어서 실행해도 될 것 같다. 굳이 아래 내용을 꼼꼼하게 읽을 필요가 없겠지...

Docker image

Docker 이미지는 공식적으로 제공되는 GitLab CE image가 있고, 누군가 소스설치로 image를 만든 것이 있었다. 나는 GitHub에서 sameersbn이 만들어놓은 GitLab 이미지를 사용했다. 설치의 대부분은 저장소의 README.md 파일을 확인하면 사실 어려운 부분은 없다.

설치

전체 과정은 mysql, redis 컨테이너를 생성하고 gitlab 컨테이너를 생성할때 mysql, redis 컨테이너를 링크 하는 순서로 되어 있다.

Data Store

GitLab의 사용자 생성 데이터를 컨테이너에 포함해서 관리할 경우, 컨테이너가 삭제되면 데이터 파일이 모두 유실될 우려가 있다. 때문에 데이터 볼륨을 별도로 생성하고 마운트(/home/git/data) 하자.

# Data Store 디렉토리 생성
mkdir -p /srv/docker/gitlab/gitlab

# SELinux를 사용한다면 아래 명령어를 통해 보안설정을 변경해야 한다.
sudo chcon -Rt svirt_sandbox_file_t /srv/docker/gitlab/gitlab

MySQL

PostgreSQL을 사용할 경우 링크를 참조.

외부 MySQL 서버를 설정하는 방법과 MySQL Container를 링크하는 방식 중, 링크 하는 방법을 사용했다.

# docker index로 부터 mysql image를 pull 한다.
docker pull sameersbn/mysql:latest

# DB 데이터 저장 디렉토리 생성
# - 해당 디렉토리는 data volume으로 사용된다.
mkdir -p /srv/docker/gitlab/mysql 

# SELinux를 사용한다면 아래 명령어를 통해 보안설정을 변경해야 한다.
sudo chcon -Rt svirt_sandbox_file_t /srv/docker/gitlab/mysql

# 컨테이너 생성 및 시작 (DB_PASS 의 옵션을 변경해서 사용해야 한다)
docker run --name gitlab-mysql -d \
    --env 'DB_NAME=gitlabhq_production' \
    --env 'DB_USER=gitlab' --env 'DB_PASS=password' \
    --volume /srv/docker/gitlab/mysql:/var/lib/mysql \
    sameersbn/mysql:latest

Redis

GitLab은 key-value 데이터 저장을 위해서 redis server를 사용한다. mysql과 마찬가지로 외부 redis 서버를 사용할 수도 있고, redis 컨테이너를 생성해서 링크를 할 수도 있다. 여기서는 링크하는 방법을 사용한다.

# docker index로 부터 redis image를 pull 한다.
docker pull sameersbn/redis:latest

# 컨테이너 생성 및 시작
docker run --name gitlab-redis -d \
    --volume /srv/docker/gitlab/redis:/var/lib/redis \
    sameersbn/redis:latest

GitLab

# GitLab 이미지를 pull 한다.
docker pull sameersbn/gitlab:7.13.3

# 컨테이너 생성 및 시작
docker run --name gitlab -d \
    --link gitlab-mysql:mysql --link gitlab-redis:redisio \
    --publish 10022:22 --publish 10080:80 \
    --env 'GITLAB_PORT=10080' --env 'GITLAB_SSH_PORT=10022' \
    --volume /srv/docker/gitlab/gitlab:/home/git/data \
    sameersbn/gitlab:7.13.3

--publish 옵션이 있는데, 호스트에 연결된 컨테이너의 22포트를 10022로 노출시키고 80포트를 10080 포트로 노출시킨다는 옵션입니다.

GitLab 설정

  1. 컨테이너 생성시에 옵션으로 추가하는 방법
  2. 옵션 없이 컨테이너를 생성하고 컨테이너 내부의 GitLab 설정 파일을 수정하는 방법

ssh 포트 변경

아무래도 예전에는 GitLab을 호스트에 바로 올려서 사용했기 때문에 모든 git 로컬 저장소의 리모트 주소는 기본 22포트를 사용되도록 되어 있다(예: [email protected]:ygpark/playground.git). 그래서 10022 포트가 아닌 22포트를 사용해야 하기 때문에 docker run 옵션을 --publish 22:22로 변경했는데... 이미 사용하고 있는 포트라고 뜬다. 호스트에서 SSH 포트로 22를 사용하고 있어서 중복되기 때문에 그렇다. 그럼 호스트의 SSH 포트를 22가 아닌 포트로 변경하면 해결이 된다.

CentOS 7 에서 SSH 포트를 변경할때는 SELinux, 방화벽에 포트를 추가 해줘야 한다. CentOS 7 / RHEL 7 : change OpenSSH port number ( SELINUX enabled ) 링크를 통해 수정하도록 하자.

순서를 간단하게 정리하면 아래와 같다.

  • SSH 설정파일에서 포트 번호 변경
  • SELinux 에 ssh_port_t 의 tcp 포트 번호 변경
  • firewalld에 tcp 포트 추가
  • ss 명령으로 확인

서버 재시작 후 docker 서비스 재시작 후

docker 재 시작후 에 (gitlab image: 7.13.1)

  • mysql 링크가 깨졌다 (docker/container/[container hash]/config.v2.json 수정: service docker stop 이후에)
  • gitlab 컨테이너 내부에서 nginx 실행이 되질 않는다
    • docker exec 로 컨테이너 내부를 터미널로 들어가서 /etc/nginx/site-enabled/gitlab.old 파일 삭제 (그 전에 /var/log/nginx 의 로그 확인)
  • host 서버에서 9000 포트 접근이 되질 않는다 (host 서버 내에서는 9000포트 접근 가능 확인, 컨테이너 내부에서도 9000포트 접근 확인, 외부만 안됨 => 방화벽!)

와... 뭐지

results matching ""

    No results matching ""